/**
 * 1、依次顺序执行一系列任务；
 * 2、所有任务执行完毕后，返回所有任务的结果；
 * 3、需要返回两个方法，start用于启动任务，pause用于暂停任务；
 * 4、每个任务具有原子性，即不可中断，只能在两个任务之间中断暂停；
 * @param tasks 任务列表
 * @returns
 */
export function processTasks<T extends Function>(...tasks: T[]) {
  // 定义一个变量i，用于记录当前执行的任务索引
  let i = 0,
    // 定义一个变量isRunning，用于记录当前是否正在执行任务
    isRunning = false
  // 定义一个数组result，用于存储每个任务的结果
  const result: unknown[] = []
  // 返回一个对象，包含start和pause两个方法
  return {
    // start方法，用于开始执行任务
    start() {
      // eslint-disable-next-line no-async-promise-executor
      return new Promise(async (resolve) => {
        // 如果当前正在执行任务，则直接返回
        if (isRunning) return
        // 将isRunning设置为true，表示当前正在执行任务
        isRunning = true
        // 循环执行任务
        while (i < tasks.length) {
          // 获取当前任务
          const task = tasks[i]
          // 执行当前任务，并获取结果
          const res = await task()
          // 将结果添加到result数组中
          result.push(res)
          // 将i加1，表示下一个任务
          i++
          // 如果当前不在执行任务，则直接返回
          if (!isRunning) {
            return
          }
        }
        // 将isRunning设置为false，表示当前任务执行完毕
        isRunning = false
        // 解析Promise对象，并返回result数组
        resolve(result)
      })
    },
    // pause方法，用于暂停执行任务
    pause() {
      // 将isRunning设置为false，表示当前不在执行任务
      isRunning = false
    }
  }
}
